# 导入Document类，用于创建文档对象
from llama_index.core import Document

# 导入TokenTextSplitter类，用于将文档按token分割为多个节点
from llama_index.core.node_parser import TokenTextSplitter

# 创建一个长文档，内容为"123456"重复10次，附带元数据
long_document = Document(text="123456" * 10, metadata={"123": "456"})  # 重复10次

# 打印原始文档的长度（字符数）60
print(f"原始文档长度: {len(long_document.text)} 字符")
# 打印原始文档的全部内容 60
print(f"原始文档内容: {long_document.text}")
# 打印原始文档的元数据信息 6
print(f"元数据: {long_document.metadata}")

# 创建一个token分割器，设置分块大小为10，重叠为0 chunk_size=包含的文本的长度+元数据的长度    节点 node元数据会继承Document的
# 每个chunk  10=包含 4个字符+6个元数据字符 60/4=15
token_splitter = TokenTextSplitter(chunk_size=10, chunk_overlap=3)  # chunk_overlap=3
# 使用分割器将长文档分割为多个节点
nodes = token_splitter.get_nodes_from_documents([long_document])

# 打印分块大小的设置 10
print(f"设置的分块大小: {token_splitter.chunk_size} tokens")
# 打印重叠大小的设置 0
print(f"设置的重叠大小: {token_splitter.chunk_overlap} tokens")
# 打印分割后节点的数量 15
print(f"分割后节点数量: {len(nodes)}")

# 打印各节点详细分析的标题
print(f"\n=== 各节点详细分析 ===")
# 遍历每个节点，输出其内容、长度和元数据
for i, node in enumerate(nodes):
    # 打印当前节点编号
    print(f"节点 {i+1}:")
    # 打印当前节点的内容  1234
    print(f"  内容: '{node.text}'")
    # 打印当前节点的内容长度 4
    print(f"  长度: {len(node.text)} 字符")
    # 打印当前节点的元数据 6
    print(f"  元数据: {node.metadata}")

# 打印统计信息的标题
print(f"\n=== 统计信息 ===")
# 计算所有节点内容的总长度
total_length = sum(len(node.text) for node in nodes)
# 计算每个节点内容的平均长度
avg_length = total_length / len(nodes)
# 打印所有节点内容的总长度
print(f"所有节点总长度: {total_length} 字符")
# 打印每个节点内容的平均长度
print(f"平均每个节点长度: {avg_length:.0f} 字符")

# 将所有节点的内容拼接起来
combined_text = "".join(node.text for node in nodes)
# 打印验证结果的标题
print(f"\n=== 验证结果 ===")
# 打印拼接后内容的总长度
print(f"节点内容组合后长度: {len(combined_text)} 字符")
# 判断拼接后内容是否与原始文档内容一致
print(f"内容是否一致: {combined_text == long_document.text}")
# 打印拼接后的全部内容
print(f"组合后内容: {combined_text}")
